home *** CD-ROM | disk | FTP | other *** search
/ Atari Mega Archive 1 / Atari Mega Archive - Volume 1.iso / gnu / smlltalk / smtk_11.zoo / Integer.st < prev    next >
Text File  |  1990-05-26  |  5KB  |  258 lines

  1. "======================================================================
  2. |
  3. |   Integer Method Definitions
  4. |
  5.  ======================================================================"
  6.  
  7.  
  8. "======================================================================
  9. |
  10. | Copyright (C) 1988, 1989, 1990 Free Software Foundation, Inc.
  11. | Written by Steve Byrne.
  12. |
  13. | This file is part of GNU Smalltalk.
  14. |
  15. | GNU Smalltalk is free software; you can redistribute it and/or modify it
  16. | under the terms of the GNU General Public License as published by the Free
  17. | Software Foundation; either version 1, or (at your option) any later version.
  18. | GNU Smalltalk is distributed in the hope that it will be useful, but WITHOUT
  19. | ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
  20. | FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
  21. | details.
  22. | You should have received a copy of the GNU General Public License along with
  23. | GNU Smalltalk; see the file COPYING.  If not, write to the Free Software
  24. | Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  
  25. |
  26.  ======================================================================"
  27.  
  28.  
  29. "
  30. |     Change Log
  31. | ============================================================================
  32. | Author       Date       Change 
  33. | sbyrne     25 Apr 90      Fixed (oh...happy birthday, Integer.st!) bitInvert.
  34. |              After fixing the lexer to be pickier about integer
  35. |              literals that were too large to be represented as
  36. |              Smalltalk literals, the previous code (which xored
  37. |              with 7fffffff) broke, so as a hack I computed two's
  38. |              complement and subtracted one.
  39. |
  40. | sbyrne     25 Apr 89      created.
  41. |
  42. "
  43.  
  44. Number variableWordSubclass: #Integer "### Not really a variable word subclass"
  45.        instanceVariableNames: ''
  46.        classVariableNames: ''
  47.        poolDictionaries: ''
  48.        category: nil.
  49.  
  50. Integer comment:
  51. 'I am the integer class of the GNU Smalltalk system.  My instances can 
  52. represent 31 bit integers and are as efficient as possible.' !
  53.  
  54. !Integer methodsFor: 'Misc math operators'!
  55.  
  56. hash
  57.     ^self
  58. !!
  59.  
  60.  
  61.  
  62. !Integer methodsFor: 'Other iterators'!
  63.  
  64. timesRepeat: aBlock
  65.     | i |
  66.     i _ 1.
  67.     [ i <= self ] whileTrue: [ aBlock value.
  68.                                i _ i + 1 ]
  69. !!
  70.  
  71.  
  72.  
  73. !Integer methodsFor: 'bit operators'!
  74.  
  75. bitAt: index
  76.     ^(self bitShift: index negated) bitAnd: 1
  77. !
  78.  
  79. bitInvert
  80.     "Return the 1's complement of the bits of the receiver"
  81.     ^self negated - 1        "compute 2's complement then remove 1"
  82. !
  83.  
  84.  
  85. allMask: anInteger
  86.     "True if all bits in anInteger are 1 in the receiver"
  87.     ^(self bitAnd: anInteger) = anInteger
  88. !
  89.  
  90. anyMask: anInteger
  91.     "True if any 1 bits in anInteger are 1 in the receiver"
  92.     ^(self bitAnd: anInteger) ~= 0
  93. !
  94.  
  95. noMask: anInteger
  96.     "True if no 1 bits in anInteger are 1 in the receiver"
  97.     ^(self bitAnd: anInteger) = 0
  98. !
  99.  
  100. highBit
  101.     "Return the index of the highest order 1 bit of the receiver"
  102.     self = 0 ifTrue: [ ^-1 ].    "??? I don't know what the right value is"
  103.     30 to: 1 step: -1 do:
  104.         [ :i | (self bitAnd: (1 bitShift: i)) ~= 0 ifTrue: [ ^i ] ]
  105. !!
  106.  
  107.  
  108.  
  109. !Integer methodsFor: 'Math methods'!
  110.  
  111. factorial
  112.     self < 2 ifTrue: [ ^1 ]
  113.              ifFalse: [ ^self * (self - 1) factorial ]
  114. !
  115.  
  116. gcd: anInteger
  117.     | selfInteger temp |
  118.     "Return the greatest common divisor (Euclid's algorithm)"
  119.     selfInteger _ self.
  120.     [ anInteger ~= 0 ]
  121.         whileTrue: [ temp _ selfInteger \\ anInteger.
  122.                  selfInteger _ anInteger.
  123.              anInteger _ temp. ].
  124.     ^self
  125. !
  126.  
  127. lcm: anInteger
  128.     ^(self * anInteger) abs // (self gcd: anInteger)
  129. !
  130.  
  131. even
  132.     ^(self bitAnd: 1) = 0
  133. !
  134.  
  135. odd
  136.     ^(self bitAnd: 1) ~= 0
  137. !!
  138.  
  139.  
  140.  
  141. !Integer methodsFor: 'Coercion methods (heh heh heh)'!
  142.  
  143. asCharacter
  144.     "Return self as an ascii character"
  145.     (self <= 255 and: [ self >= 0])
  146.         ifTrue: [ ^Character value: self ]
  147.     ifFalse: [ ^self error: 'Integer not convertible to character' ]
  148. !
  149.  
  150. coerce: aNumber
  151.     ^aNumber truncated
  152. !
  153.  
  154. generality
  155.     ^1
  156. !
  157.  
  158. ceiling
  159.     ^self
  160. !
  161.  
  162. floor
  163.     ^self
  164. !
  165.  
  166. truncated
  167.     ^self
  168. !
  169.  
  170. rounded
  171.     ^self
  172. !!
  173.  
  174.  
  175.  
  176.  
  177. !Integer methodsFor: 'copying'!
  178.  
  179. shallowCopy
  180.     ^self
  181. !
  182.  
  183. deepCopy
  184.     ^self
  185. !!
  186.  
  187.  
  188.  
  189.  
  190. !Integer methodsFor: 'printing'!
  191.  
  192. printOn: aStream base: b
  193.     aStream nextPutAll: (self radix: b)
  194. !
  195.  
  196. radix: baseInteger
  197.     ^self signedStringBase: baseInteger showRadix: true
  198. !
  199.  
  200. printOn: aStream
  201.     (self signedStringBase: 10 showRadix: false) printOn: aStream
  202. !!
  203.  
  204.  
  205.  
  206. !Integer methodsFor: 'storing'!
  207.  
  208. storeOn: aStream
  209.     self printOn: aStream        "they print and store the same"
  210. !!
  211.  
  212.  
  213.  
  214. !Integer methodsFor: 'not implemented'!
  215.  
  216. asFraction
  217.     self notYetImplemented
  218. !!
  219.  
  220.  
  221.  
  222. !Integer methodsFor: 'private'!
  223.  
  224. signedStringBase: baseInteger showRadix: showRadix
  225.     | str revString string sign len num i |
  226.     self < 0
  227.         ifTrue: [ sign _ true.
  228.               num _ self negated ]
  229.     ifFalse: [ sign _ false.
  230.                num _ self ].
  231.     revString _ num revDigitsBase: baseInteger.
  232.     str _ WriteStream on: (String new: 1).
  233.     showRadix ifTrue:
  234.         [ baseInteger printOn: str.
  235.       str nextPut: $r ].
  236.     sign ifTrue: [ str nextPut: $- ].
  237.     revString reverseDo:
  238.         [ :char | str nextPut: char ].
  239.     ^str contents
  240. !
  241.  
  242. revDigitsBase: b    
  243.     | str num |
  244.     str _ WriteStream on: (String new: 1).
  245.     self = 0
  246.         ifTrue: [ str nextPut: $0 ]
  247.     ifFalse: [
  248.             num _ self.
  249.         [ num = 0 ] whileFalse:
  250.             [ str nextPut: (Character digitValue: num \\ b).
  251.           num _ num // b ] ].
  252.     ^str contents
  253.  
  254. !!
  255.  
  256.